/**
 * @file ServerThread.h
 * @author Jakub Trzaskoma
 *
 * Klasa odpowiada za wysyłanie i odbieranie komunikatów między klientami a serwerem.
 */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "structures.h"

#ifndef SERVERTHREAD_H_
#define SERVERTHREAD_H_

namespace tftp_server
{
/**
 * @class ServerThread
 * Klasa odpowiada za wysyłanie i odbieranie komunikatow między klientami a serwerem.
 */
class ServerThread
{
private:
	/**
	 * Kostruktor bezargumentowy prywatny z powodu zastosowania wzorca singleton.
	 */
	ServerThread(){}
	/**
	 * Kostruktor kompiujący prywatny z powodu zastosowania wzorca singleton.
	 */
	ServerThread(const ServerThread&);
	/**
	 * Operator przypisania prywatny z powodu zastosowania wzorca singleton.
	 */
	ServerThread& operator=(const ServerThread&);

public:
	/**
	 * Metody wysyłąjąca odpowiedni pakiet do konretnego klienta.
	 * @param package_ - pakiet do wysłania.
	 * @param socket_ -  gnizado przez które ma zostać wysłany pakiet.
	 * @param clientName_ - struktura zawierająca informacje o adresie klienta do którego ma zostać wysłąny pakiet.
	 */
	void sendPackage(Package package_, int socket_,
			struct sockaddr_in clientName_);
	/**
	 * Metoda odbierająca pakiet od konkretnego klienta.
	 * @param socket_ -  gnizado na które ma nadejść infomacja od klienta.
	 * @param clientName_ - struktura zaweirająca informacje o kliencie od którego odbieramy pakiet.
	 * @return Odebrany pakiet
	 */
	Package receivePackage(int socket_, struct sockaddr_in clientName_);

	/**
	 * Inicjalizacja statycznego obietku
	 */
	static ServerThread& getInstance()
	{
		static ServerThread instance;
		return instance;
	}

};

}

#endif /* SERVERTHREAD_H_ */
